#ifndef __FUNC_H__
#define __FUNC_H__
#include <my_header.h>
#include "dir_stack.h"


//接收发送缓冲区大小
#define BUF_SIZE 1024
//命令中最多有几个参数
#define MAX_WORDNUM 5
//命令一个参数的最大长度
#define MAX_WORDLEN 40
//外部维护的系统级工作目录
#define ROOTDIR "/home/fhf/user_space/fu"
//100MB
#define HUNDRED_MEGABYTE 104857600

//套接字类型
typedef int socket_t;

//通讯类型
typedef struct {
	socket_t  _sess_fd ;             //对端套接字
	char _sess_buf[BUF_SIZE] ;  //缓冲区
}Session_t, *pSession_t ;

//命令类型
typedef struct cmd_s{
    int argc;       //命令中有几个参数
    char cmd[MAX_WORDNUM][MAX_WORDLEN];
}cmd_t, *pcmd_t;

//私有文件传输协议:TLV 小火车
typedef struct {
    /* int tag; //命令类型tag */
    int data_length;//货车头，表示数据长度
    char data[BUF_SIZE];//火车车厢，表示数据
}train_t, *ptrain_t, Truck_t;

void conf_get(char *conf, char *ip, int *port, int *thread_num); //从配置文件中获取参数
socket_t tcp_init(char *ip, int port); //返回一个正在监听的tcp类型的服务器套接字,socket setsocketopt bind listen
void *child_thread_handle(void* p); //子线程的具体工作
int epoll_add(int fd, int epfd);   //将fd加入epfd
int epoll_del(int fd, int epfd);   //将fd从epfd里删除
void print_cmd(pcmd_t pcmd); //打印命令
                             
int upload(int fd_socket, char *filename); //上传文件
int download(int fd_socket, char *filename); //下载文件

void record_log_connect(int fd_log, int fd_client, const char *msg);
void record_log_cmd(int fd_log, int fd_client, pcmd_t pcmd);


/* int login_check(socket_t fd, ptrain_t ptrain); //验证客户端的用户名和密码 */
/* //执行命令，并向客户端发送命令结果 */
/* int do_ls(socket_t fd_client, ptrain_t ptrain, pdir_stack_t *dir_stack); */
/* int do_pwd(socket_t fd_client, ptrain_t ptrain, pdir_stack_t *dir_stack); */
/* int do_cd(socket_t fd_client, ptrain_t ptrain, pcmd_t pcmd, pdir_stack_t *dir_stack); */
/* int do_rm(socket_t fd_client, ptrain_t ptrain, pcmd_t pcmd, pdir_stack_t *dir_stack); */
/* int do_mkdir(socket_t fd_client, ptrain_t ptrain, pcmd_t pcmd, pdir_stack_t *dir_stack); */
/* int do_puts(socket_t fd_client, ptrain_t ptrain, pcmd_t pcmd, pdir_stack_t *dir_stack); */
/* int do_gets(socket_t fd_client, ptrain_t ptrain, pcmd_t pcmd, pdir_stack_t *dir_stack); */

/* int get_filesize(char *filename); //获取文件大小 */
/* int send_file_train(int fd_client, char *filename); //小于100M的发送方式 */
/* int send_file_sendfile(int fd_client, char *filename, off_t filesize); //文件大于100M, 用sendfile发送文件 */
/* int recv_file_train(int fd_socket, char *filename); //小于100M的接收方式 */
/* int recv_file_mmap(int fd_socket, char *filename, off_t filesize); //大于100M，用mmap接收 */

#endif


